package com.ty.user.starter.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ty.user.starter.entity.User;
import com.ty.user.starter.entity.criteria.UserCriteria;
import com.ty.user.starter.entity.dto.ChangPwdDto;
import com.ty.user.starter.entity.dto.UserDto;
import com.ty.user.starter.entity.dto.UserLoginDto;
import com.ty.user.starter.entity.vo.RoleVo;
import com.ty.user.starter.entity.vo.UserVo;
import com.ty.user.starter.exception.UserMgtException;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author minku
 * @since 2021-10-15
 */
@Validated
public interface UserService extends IService<User> {

    /**
     * 新增用户
     *
     * @param dto 用户信息
     */
    void add(@Valid UserDto dto) throws UserMgtException;

    /**
     * 修改用户
     *
     * @param dto 用户信息
     */
    void edit(@Valid UserDto dto) throws UserMgtException;

    /**
     * 修改密码
     *
     * @param dto 密码信息
     */
    void changPwd(@Valid ChangPwdDto dto) throws UserMgtException;

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    User getByUsername(String username);

    /**
     * 根据用户id查询
     *
     * @param userId 用户id
     * @return 用户信息
     */
    UserVo getById(long userId);


    /**
     * 查询用户的角色信息
     *
     * @param userId 用户id
     * @return 角色信息
     */
    List<RoleVo> getRoles(long userId);

    /**
     * 登录
     *
     * @param dto 登录信息
     */
    UserVo login(@Valid UserLoginDto dto);

    /**
     * 分页
     *
     * @param criteria 分页条件
     * @return 用户列表
     */
    IPage<UserVo> findAll(@Valid UserCriteria criteria);

    /**
     * 批量设置部门信息
     *
     * @param deptId  部门id
     * @param userIds 用户id列表
     */
    void batchSetDept(long deptId, List<Long> userIds);

    /**
     * 批量设置状态
     *
     * @param state   状态
     * @param userIds 用户id列表
     */
    void batchSetState(boolean state, List<Long> userIds);

    /**
     * 删除
     * 注意:如员工信息已在系统中产生业务行,则不建议进行删除
     *
     * @param userId
     */
    void delete(long userId) throws UserMgtException;
}
